001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Jan 16, 2003
005 * Time: 8:39:52 PM
006 */
007
008 package EVolve.util.predefinedutils;
009
010 import EVolve.Scene;
011 import EVolve.exceptions.*;
012 import EVolve.visualization.*;
013 import EVolve.visualization.Dimension;
014 import javax.swing.*;
015 import java.util.*;
016 import java.io.*;
017 import java.awt.*;
018 import java.awt.event.*;
019
020 public class VisualizationSerializer {
021 private static VisualizationSerializer instance = null;
022 private JDialog dialog;
023 private JCheckBox checkSelection;
024 private JTextField textConfigureName, textSelectionName;
025 private JTextField textConfigureFile, textSelectionFile;
026 private JButton buttonConfigure, buttonSelection;
027 private JButton buttonSave, buttonCancel;
028 private FileWriter fileConfigure, fileSelection;
029
030 private VisualizationSerializer() {
031 dialog = null;
032 }
033
034 public static VisualizationSerializer v() {
035 if (instance == null) instance = new VisualizationSerializer();
036 return instance;
037 }
038
039 public void readSetting() {
040
041 }
042
043 public void showSavingDialog() {
044 if (dialog == null) {
045 createDialog();
046 } else {
047 if (Scene.getFilter().getSelection().length == 0) {
048 checkSelection.setSelected(false);
049 textSelectionName.setEnabled(false);
050 textSelectionFile.setEnabled(false);
051 buttonSelection.setEnabled(false);
052 }
053 dialog.setVisible(true);
054 }
055 }
056
057 private void createDialog() {
058 Box boxMain = new Box(BoxLayout.Y_AXIS);
059
060 dialog = new JDialog(Scene.getFrame(), "Setting Saving...", true);
061 dialog.setBounds(new Rectangle(500,250));
062
063
064 boxMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
065 "Save configuration and selections"));
066 dialog.getContentPane().add(boxMain,BorderLayout.CENTER);
067
068 //***********************************
069 Box boxConfigureName = new Box(BoxLayout.X_AXIS);
070 boxConfigureName.add(new JLabel("Configuration name:"));
071 textConfigureName = new JTextField(12);
072 boxConfigureName.add(Box.createHorizontalStrut(25));
073 boxConfigureName.add(textConfigureName);
074
075 Box boxConfig = new Box(BoxLayout.X_AXIS);
076 boxConfig.add(new JLabel("Choose configure file:"));
077 textConfigureFile = new JTextField(12);
078 boxConfig.add(Box.createHorizontalStrut(20));
079 boxConfig.add(textConfigureFile,BorderLayout.CENTER);
080 buttonConfigure = new JButton("...");
081 buttonConfigure.addActionListener(new ActionListener(){
082 public void actionPerformed(ActionEvent e) {
083 JFileChooser fc = selectFile();
084 if (fc == null) return;
085 textConfigureFile.setText(fc.getSelectedFile().getPath());
086 }
087 });
088 boxConfig.add(buttonConfigure,BorderLayout.EAST);
089
090 //*****************************
091 Box boxChk = new Box(BoxLayout.X_AXIS);
092 checkSelection = new JCheckBox("Saving Filters & colors also");
093 checkSelection.setMnemonic(KeyEvent.VK_F);
094 checkSelection.addActionListener(new ActionListener() {
095 public void actionPerformed(ActionEvent e) {
096 boolean enable = checkSelection.isSelected();
097 if (Scene.getFilter().getSelection().length == 0) {
098 Scene.showErrorMessage("No active selection exists!");
099 checkSelection.setSelected(false);
100 } else {
101 buttonSelection.setEnabled(enable);
102 textSelectionFile.setEnabled(enable);
103 textSelectionName.setEnabled(enable);
104 }
105 }
106 });
107 boxChk.add(checkSelection);
108 JLabel note = new JLabel("(If checked, the configuration file can ONLY be applied to " +
109 " the current data source.)");
110 note.setFont(new Font("Dialog",Font.ITALIC|Font.BOLD,9));
111 boxChk.add(note);
112
113 //***********************************
114 Box boxSelectionName = new Box(BoxLayout.X_AXIS);
115 boxSelectionName.add(new JLabel("Selection name:"));
116 boxSelectionName.add(Box.createHorizontalStrut(25));
117 textSelectionName = new JTextField(12);
118 boxSelectionName.add(textSelectionName);
119
120 Box boxSelection = new Box(BoxLayout.X_AXIS);
121 boxSelection.add(new JLabel("Choose selection file:"));
122 textSelectionFile = new JTextField(12);
123 boxSelection.add(Box.createHorizontalStrut(20));
124 boxSelection.add(textSelectionFile,BorderLayout.CENTER);
125 buttonSelection = new JButton("...");
126 buttonSelection.addActionListener(new ActionListener() {
127 public void actionPerformed(ActionEvent e) {
128 JFileChooser fc = selectFile();
129 if (fc == null) return;
130 textSelectionFile.setText(fc.getSelectedFile().getPath());
131 }
132 });
133 boxSelection.add(buttonSelection,BorderLayout.EAST);
134
135 //***********************************
136 Box boxSaveCancel = new Box(BoxLayout.X_AXIS);
137 buttonSave = new JButton("Save");
138 buttonSave.addActionListener(new ActionListener() {
139 public void actionPerformed(ActionEvent e) {
140 if (!validate()) return;
141 dialogSave();
142 }
143 });
144
145 buttonCancel = new JButton("Cancel");
146 buttonCancel.addActionListener(new ActionListener() {
147 public void actionPerformed(ActionEvent e) {
148 dialog.setVisible(false);
149 }
150 });
151 boxMain.add(Box.createHorizontalStrut(40));
152 boxSaveCancel.add(buttonSave);
153 boxSaveCancel.add(Box.createHorizontalStrut(25));
154 boxSaveCancel.add(buttonCancel);
155
156 boxMain.add(boxConfigureName);
157 boxMain.add(Box.createVerticalStrut(5));
158 boxMain.add(boxConfig);
159 boxMain.add(Box.createVerticalStrut(15));
160 boxMain.add(boxChk);
161 boxMain.add(Box.createVerticalStrut(8));
162 boxMain.add(boxSelectionName);
163 boxMain.add(Box.createVerticalStrut(5));
164 boxMain.add(boxSelection);
165 boxMain.add(Box.createVerticalStrut(25));
166 boxMain.add(boxSaveCancel);
167
168 textSelectionName.setEnabled(false);
169 textSelectionFile.setEnabled(false);
170 buttonSelection.setEnabled(false);
171 dialog.getContentPane().add(boxMain);
172 dialog.setResizable(false);
173 dialog.pack();
174 Scene.getUIManager().showDialog(dialog, dialog.getWidth(), dialog.getHeight());
175 }
176
177 private JFileChooser selectFile() {
178 JFileChooser fc = new JFileChooser();
179 if (fc.showSaveDialog(Scene.getFrame()) == JFileChooser.APPROVE_OPTION) {
180 return fc;
181 }
182 return null;
183 }
184
185 private void dialogSave() {
186 saveConfiguration();
187 if (checkSelection.isSelected())
188 saveSelection();
189 dialog.setVisible(false);
190 }
191
192 private boolean validate() {
193 if ((textConfigureFile.getText() == null) || (textConfigureName.getText() == null)) {
194 Scene.showErrorMessage("User must name the configuration to be saved and choose a file!");
195 return false;
196 }
197
198 if (checkSelection.isSelected() &&
199 ((textSelectionFile.getText() == null) || (textSelectionName.getText() == null))) {
200 Scene.showErrorMessage("User must name the filters to be saved and select a file to save them!");
201 return false;
202 }
203
204 return true;
205 }
206
207 private void saveConfiguration() {
208 ArrayList vizList = Scene.getVisualizationManager().getVisualizationList();
209 if (vizList.size() == 0) {
210 Scene.showErrorMessage("Nothing to be saved!");
211 return;
212 }
213
214 try {
215 fileConfigure = new FileWriter(textConfigureFile.getText().trim(),false);
216 } catch (IOException ioe) {
217 Scene.showErrorMessage("Can not access file \""+textConfigureFile.getText()+"\"");
218 return;
219 }
220
221 try {
222 String configureName = textConfigureName.getText().trim();
223 fileConfigure.write(Scene.VERSION+"\n");
224 fileConfigure.write("File Type:Configuration\n");
225 fileConfigure.write("Store:;\n");
226 fileConfigure.write(configureName+"\n");
227 fileConfigure.write("Datasource:"+(checkSelection.isSelected() ? Scene.getCurrentDataFilename() : ";")+"\n");
228 fileConfigure.write("Selection:"+(checkSelection.isSelected() ? textSelectionFile.getText() : ";")+"\n");
229 for (int i = 0; i<vizList.size(); i++) {
230 Visualization visual = (Visualization)vizList.get(i);
231 HashMap config = visual.getCurrentConfigure();
232 fileConfigure.write(visual.getFactory().getFactoryName()+"\n");
233 fileConfigure.write(visual.getSubjectDefinition().getName()+"\n");
234 Dimension[] dim = (Dimension[])config.get("Dimension");
235 for (int j=0;j<dim.length;j++) {
236 fileConfigure.write(dim[j].getDataFilter().getName()+"\n");
237 }
238 for (int j=dim.length; j<3; j++) fileConfigure.write(";not using this dimension\n");
239 if (config.get("Predictor") != null)
240 fileConfigure.write(((PredictorFactory)config.get("Predictor")).getName()+"\n");
241 else
242 fileConfigure.write(";not using predictor\n");
243
244 String intervalString = "";
245 intervalString += config.get("Interval").toString();
246 if (config.get("BeginCall")!=null) {
247 intervalString = intervalString + ";" + config.get("BeginCall").toString() + ",";
248 intervalString = intervalString + config.get("EndCall").toString();
249 }
250 if (config.get("Match") != null) {
251 intervalString = "," + intervalString + config.get("Match").toString();
252 }
253 fileConfigure.write(intervalString+"\n");
254
255 fileConfigure.write(visual.getWindow().getTitle()+"\n");
256 Rectangle rect = visual.getWindow().getBounds();
257 fileConfigure.write(new Integer(rect.x).toString() + "\n");
258 fileConfigure.write(new Integer(rect.y).toString() + "\n");
259 fileConfigure.write(new Integer(rect.width).toString() + "\n");
260 fileConfigure.write(new Integer(rect.height).toString() + "\n");
261 fileConfigure.write((String)config.get("Options")+"\n");
262 }
263 Scene.getUIManager().refreshMenu(textConfigureFile.getText(),configureName);
264 fileConfigure.flush();
265 fileConfigure.close();
266 } catch (IOException e) {
267 Scene.showErrorMessage("Error occurred when trying to save configuration!");
268 }
269
270 }
271
272 private void saveSelection() {
273 try {
274 fileSelection = new FileWriter(textSelectionFile.getText().trim(),false);
275 } catch (IOException ioe) {
276 Scene.showErrorMessage("Can not access file \""+textSelectionFile.getText()+"\"");
277 return;
278 }
279 Scene.getFilter().saveSelection(fileSelection,textSelectionName.getText().trim());
280 }
281
282 public void loadConfiguration() {
283 JFileChooser fc = new JFileChooser(Scene.getUIManager().getLastConfigDir());
284 String configureName = null,filename = null;
285
286 if(fc.showOpenDialog(Scene.getFrame()) != JFileChooser.APPROVE_OPTION) return;
287
288 try {
289 filename = fc.getSelectedFile().getPath();
290 Scene.getUIManager().setLastConfigDir(filename);
291 SerializerInfo info = getVizInfoFromDisk(filename);
292 configureName = info.name;
293 } catch (Exception e) {
294 Scene.showErrorMessage(e.getMessage());
295 return;
296 }
297 Scene.getUIManager().refreshMenu(filename,configureName);
298 }
299
300 public void loadData(String dataFile) throws EVolveException{
301 if (dataFile.charAt(0)!= ';') {
302 // autoload data source
303 if (!Scene.getCurrentDataFilename().equals(dataFile)) {
304 Scene.setDataFilename(dataFile);
305 Scene.autoLoadDataSource();
306 Scene.setDataFilename(null);
307 }
308 //String selection = selFile.substring(selFile.indexOf(':')+1);
309 //RandomAccessFile file = new RandomAccessFile(selection,"r");
310 //Scene.getFilter().loadSelection(file);
311 }
312 }
313
314 public void loadSelection(String selFile) throws EVolveException{
315 try {
316 if (selFile.charAt(0)!= ';') {
317 RandomAccessFile file = new RandomAccessFile(selFile,"r");
318 Scene.getFilter().loadSelection(file);
319 }
320 } catch (IOException e) {
321 Scene.showErrorMessage("IO exception occurred when trying to load selections and data source.");
322 }
323 }
324
325 public SerializerInfo getVizInfoFromDisk(String filename) throws EVolveException {
326 String nextLine;
327 int lineno = 0;
328 SerializerInfo info = null;
329
330 try {
331 info = new SerializerInfo();
332 RandomAccessFile file = new RandomAccessFile(filename,"r");
333 info.version = file.readLine(); // get version number
334 if (!info.version.equals(Scene.VERSION)) throw (new WrongVersionException(info.version));
335 lineno++;
336
337 String fileType = file.readLine(); //get file type
338 fileType = fileType.substring(fileType.indexOf(':')+1);
339 if (fileType.charAt(0) != 'C') throw new FileTypeMismatchException("Configuration file", fileType+" file");
340
341 info.resultPath = file.readLine(); // get path where viz result is to be saved
342 info.resultPath = info.resultPath.substring(info.resultPath.indexOf(':')+1);
343 lineno++;
344 info.name = file.readLine().trim(); // get viz setting name
345 lineno++;
346 info.dsource = file.readLine(); //get data source file name, if any
347 info.dsource = info.dsource.substring(info.dsource.indexOf(':')+1);
348 lineno++;
349 info.selectionFile = file.readLine(); //get selection file name, if any
350 info.selectionFile = info.selectionFile.substring(info.selectionFile.indexOf(':')+1);
351 lineno++;
352 if (info.dsource.indexOf(';') == -1 )
353 info.specific = true;// a specific configuration
354
355 loadData(info.dsource);
356 loadSelection(info.selectionFile);
357
358 if (!Scene.getDataManager().isDataLoaded()) return info;
359
360 nextLine = file.readLine();
361 lineno++;
362 while (nextLine != null) {
363 VizInfo vizInfo = new VizInfo();
364 vizInfo.createFactory(nextLine.trim());
365 lineno++;
366 vizInfo.createSubjectDefinition(file.readLine().trim());
367 lineno++;
368 String[] dimensionDefs = new String[3];
369 for (int i=0; i<dimensionDefs.length; i++) {
370 dimensionDefs[i] = file.readLine().trim();
371 lineno++;
372 }
373 vizInfo.createDimension(dimensionDefs);
374 vizInfo.createPredictor(file.readLine().trim());
375 lineno++;
376 vizInfo.createInterval(file.readLine().trim());
377 lineno++;
378 vizInfo.createTitle(file.readLine().trim());
379 lineno++;
380 vizInfo.createWindowPosition(file.readLine().trim(),file.readLine().trim(),
381 file.readLine().trim(),file.readLine().trim());
382 lineno+=4;
383 vizInfo.createOptions(file.readLine().trim());
384 lineno++;
385
386 info.vizInfoList.add(vizInfo);
387 nextLine = file.readLine();
388 lineno++;
389 }
390 file.close();
391 } catch (EVolveException e) {
392 String detail = e.getMessage();
393 throw new ReadConfigureFileException(filename, String.valueOf(lineno),"Detailed Information:\n"+detail);
394 } catch (IOException e) {
395 Scene.showErrorMessage(e.getMessage());
396 } catch (Exception e) {
397 throw new ReadConfigureFileException(filename, String.valueOf(lineno),"Detailed Information:N/A");
398 }
399 return info;
400 }
401 }